package qdu.rg040506.ch1_activity_life_cycle;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import androidx.annotation.Nullable;

/**
 * 创建一个空的模块流程:
 * 选择无界面模板
 * 1）创建activity的子类，并重写oncreate函数
 * 2）通过调用setContentView函数设置布局文件，参数一般是一个布局文件的资源访问
 * 3) 创建布局文件  res右键 -> new 文件夹（layout）  右键 -> new -> XML -> layout xml file
 * 4) 在清单文件中，注册所有的安卓组件
 *    在application标签中，嵌入activity子标签,其中必须设置name属性
 */

/**
 * Activity生命周期
 *   activity是安卓四大组件之一
 *   主要负责安卓app界面显示
 * 该组件生命周期包含七个回调（生命周期）函数
 *  oncreate: 实例化后回调
 *  onstart:  当前界面绘制并显示完成后回调
 *  onresume: 在获取焦点后回调
 *
 *  onpause:   在失去焦点后回调
 *  onstop：   在失去显示后回调
 *  ondestroy：在实例销毁前回调
 *
 *  onrestart： 在任务栈重回前台时回调
 *
 * 1. Activity启动
 * onCreate()：初始化工作，布局资源，图片预加载等。
 * onStart()：用户可见，但是还处在后台，无法与用户交互。
 * onResume()：前台可见，可以与用户交互交互。
 *
 * 2.被其他Activity覆盖（压栈）/ 送入后台
 * onPause()：Activity处于正在停止状态。
 * onStop()：Activity处于完全覆盖状态，不可见，只能在后台运行。
 *
 * 3. 再次回到原Activity（弹栈）/ 转回前台
 * onRestart()：由不可见变为可见。
 * onStart()
 * onResume()
 *
 * 4. 点击“BACK”回退键，退出当前Activity。
 * onPause()
 * onStop()
 * onDestroy()：表示正在被销毁，回收，资源释放
 *
 * 5. 在压栈（并且不是转入后台），可定有一个新界面，此时新界面的三个函数穿插在失去显示界面的onpause和onstop之间
 *    在弹栈（不是后台转回前台），如果栈非空就会回显一个新的栈顶界面，此时新界面的三个函数穿插在失去显示界面的onpause和onstop之间
 *
 */

/**
 * 安卓任务栈（返回栈）
 * 安卓进程（task）运行时对安卓组件（activity）的管理逻辑
 * 其使用了栈（先进后出）数据结构， 栈顶组件（界面）是当前显示界面；
 * 压栈：不销毁当前界面，显示新界面；  弹栈：销毁当前栈顶界面，并栈中下一个界面送给前台显示
 *
 * 一个App中可能不止一个Task。
 * 某些特殊情况下，单独一个Activity可以独享一个Task。
 * 一个Task中的Activity可以来自不同的App。
 * 同一个App的Activity可能不在一个Task中。
 */

/**
 * Logcat
 * android studio IDE中设备的标准输出
 *
 * 设备选择菜单
 *
 * 文本过滤器：
 *     可以直接过滤文本
 *     也可以根据不同的列区分过滤: tag:xxx；  level:DEBUG   package:mine(过滤当前app的包名)
 *     两种过滤表达式之间空格默认为 &运算
 *
 * 消息显示区域:
 *   5列    [时间戳（精确到毫秒）; 进程ID（进程组）; 标签（tag  程序代码 / 预定义）; 包名;
 *          消息内容】
 *          消息内容 [级别 文本]
 *          级别（从高到低,向下包含）： V：verbose（所有信息）； D：Debug； I：info；  W：warn； E：error； A
 *
 *  安卓类库提供了Log类，用来进行标准输出
 *  i()函数：info级别， 参数1：标签值  参数2:消息文本
 */

/**
 * 事件处理
 * 1) 确定事件源（实例引用）
 * 2） 调用相应的侦听器注册函数
 * 3） 创建侦听器对象，重写回调函数以确定时间反应逻辑
 */
public class Act1 extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ly_act1);
        Log.i("mytag", "act1 oncreate");
        //System.out.println("oncreate");

        //-----------------事件处理------------------
        //findViewById函数根据资源id获取对应的实例引用
        findViewById(R.id.btn_swap).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Log.i("mytag", "button clicked....");
                Intent it = new Intent(Act1.this, Act2.class);
                //intent是安卓组件之间的桥梁
                startActivity(it);//该函数实现界面跳转
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("mytag", "act1 onstart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("mytag", "act1 onresume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("mytag", "act1 onpause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("mytag", "act1 onstop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("mytag", "act1 ondestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("mytag", "act1 onrestart");
    }
}
// act2 onpause [act1 onrestart onstart onresume] onstop ondestroy